/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package ymodem.transfer; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Enumeration; import java.util.TooManyListenersException; //import org.apache.log4j.Logger; import purejavacomm.CommPortIdentifier; import purejavacomm.PortInUseException; import purejavacomm.SerialPort; import purejavacomm.SerialPortEvent; import purejavacomm.UnsupportedCommOperationException; //import org.apache.log4j.BasicConfigurator; import ymodemguijava.*; /** * * @author maziar */ public class SendData { private Enumeration enumComm; private SerialPort serialPort; private CommPortIdentifier serialPortId; private OutputStream outputStream; private boolean serialPortGeoeffnet; private boolean isFirstSector=true; final int baudrate=115200; final int parity =serialPort.PARITY_NONE; final int stopBits=serialPort.STOPBITS_1; int flowcontrol = purejavacomm.SerialPort.FLOWCONTROL_NONE; final int dataBits=8; // static Logger logger = Logger.getLogger(SendData.class); static boolean isEnd = false; static int counter =0; private InputStream inputStream; private File file; private FileInputStream ins; private String portName; private boolean isPortOpen = false; private static String feedback; private YModemGUIJAVAView ym; private char in; private InitPacket init = new InitPacket(); int errorcunter = 0; private boolean END=false; public static boolean read= false; public void setPortname(String comport){ this.portName= comport; } public void setFilePath(String path){ this.file= new File(path); } public static String getFeedback(){ return feedback; } public boolean getOpenPort(){ return isPortOpen; } public SendData(String comPort, String path){ this.portName = comPort; this.file = new File(path); } public SendData(String comPort){ this.portName = comPort; } public SendData(){ } public void findAllSerialport(){ enumComm = CommPortIdentifier.getPortIdentifiers(); while(enumComm.hasMoreElements()){ serialPortId =(CommPortIdentifier)enumComm.nextElement(); if(serialPortId.getPortType()==CommPortIdentifier.PORT_SERIAL){ } } } public boolean oeffneSerialPort() { Boolean foundPort = false; if (serialPortGeoeffnet != false) { System.out.println("Serialport bereits geöffnet"); feedback ="Serialport bereits geöffnet"; return false; } System.out.println("Öffne Serialport"); feedback ="Öffne serialport"; enumComm = CommPortIdentifier.getPortIdentifiers(); while(enumComm.hasMoreElements()) { serialPortId = (CommPortIdentifier) enumComm.nextElement(); if (portName.contentEquals(serialPortId.getName())) { foundPort = true; break; } } if (foundPort != true) { System.out.println("Serialport nicht gefunden: " + portName); feedback ="Serialport nicht gefunden: " + portName; return false; } try { serialPort = (SerialPort) serialPortId.open("Öffnen und Senden", 500); } catch (PortInUseException e) { System.out.println("Port belegt"); feedback ="Port belegt"; } try { outputStream = serialPort.getOutputStream(); } catch (IOException e) { System.out.println("Keinen Zugriff auf OutputStream"); feedback ="Keinen Zugriff auf OutputStream"; } try { inputStream = serialPort.getInputStream(); } catch (IOException e) { System.out.println("Keinen Zugriff auf InputStream"); } try { serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity); serialPort.setFlowControlMode(flowcontrol); } catch(UnsupportedCommOperationException e) { System.out.println("Konnte Schnittstellen-Paramter nicht setzen"); feedback ="Konnte Schnittstellen-Paramter nicht setzen"; } try { serialPort.addEventListener(new PortEvetntListener()); } catch (TooManyListenersException e) { System.out.println("TooManyListenersException für Serialport"); } serialPort.notifyOnDataAvailable(true); serialPortGeoeffnet = true; return true; } public void schliesseSerialPort() { if ( serialPortGeoeffnet == true) { System.out.println("Schließe Serialport"); feedback ="Schließe Serialport"; serialPort.close(); serialPortGeoeffnet = false; } else { System.out.println("Serialport bereits geschlossen"); feedback ="Serialport bereits geschlossen"; } } private void serialPortDatenVerfuegbar() { try { byte[] data = new byte[50]; int num; while(inputStream.available() > 0) { num = inputStream.read(data, 0, data.length); if(read = true){ YModemGUIJAVAView.jTextArea1.setText(new String(data)); } else{ in =(char) data[0]; System.out.print("Daten vorhanden"); System.out.println("Empfange: "+ new String(data, 0, num)); //YModemGUIJAVAView.jTextText = new String(data); // YModemGUIJAVAView.jTextArea1.setText(new String(data)); YModemGUIJAVAView.jTextArea1.setText(Character.toString(in)); } } } catch (IOException e) { System.out.println("Fehler beim Lesen empfangener Daten"); } } private void sendDataToSerialPort(byte[] data){ try{ for(int i = 0; i< data.length;i++){ outputStream.write(data[i]); } //outputStream.write(data); }catch(IOException ex){} } // sende die Nachrichten um im reset modus zu gehen public void sendeStringSerialPort(String nachricht) { System.out.println("Sende: " + nachricht); if (serialPortGeoeffnet != true) return; try { outputStream.write(nachricht.getBytes()); } catch (IOException e) { System.out.println("Fehler beim Senden"); } } private void waitForResetDMX(){ sendeStringSerialPort(TransferSpecification.DXM_Bluetooth_reset); for(int i = 0; i<5;i++){ sendeStringSerialPort(TransferSpecification.BootloaderLetter); } sendeStringSerialPort(TransferSpecification.DMX_Bluetooth_init_Mode); while(!isC()){ if(isC()) break; } } private void restartDMX(){ sendeStringSerialPort(TransferSpecification.DMX_RESTART); } public void updateFirmware(){ //sendeStringSerialPort(TransferSpecification.DXM_Bluetooth_reset); //for(int i = 0; i<5;i++){ // sendeStringSerialPort(TransferSpecification.BootloaderLetter); //} // sendNotFirstSector(); waitForResetDMX(); if((isC()&& isFirstSector==true) && !END){ SendFirstsector(); sendNotFirstSector(); updateFirmware(); } // else if((isEnd&& isFirstSector==false)&&!END) // sendLastSector(); else if(errorcunter==TransferSpecification.MAXERRORS) YModemGUIJAVAView.jTextArea1.setText("Keine Acknolge"); else YModemGUIJAVAView.jTextArea1.setText("Keine Acknolge"); } // prüfen on Acknolege zurückkommt private boolean isAck(){ if(in==TransferSpecification.ACK) return true; else return false; } private boolean isC(){ if(in==TransferSpecification.C) return true; else return false; } private void sendNotFirstSector(){ try{ int b = 0; //int k = 1; ins = new FileInputStream(file); //int packet = ins.available()/128; //int positon = ins.available()%128; byte[] sector = new byte[TransferSpecification.sizeSectorNonZero]; int blocknumber = 1; errorcunter = 0; init.setPacknumbet(blocknumber); while(!isC() && errorcunter <TransferSpecification.MAXERRORS){ if(!isC() && errorcunter < TransferSpecification.MAXERRORS) errorcunter++; } if(errorcunter == TransferSpecification.MAXERRORS){ System.out.println("Maxx error"); } int nBytes = ins.read(sector); errorcunter =0; byte[] k = new byte[1029]; while(nBytes !=-1){ if(nBytes < TransferSpecification.sizeSectorNonZero){ init.setPacknumbet(blocknumber); // for(int k=0;k<11;k++){ sector[nBytes]= TransferSpecification.CPMEOF; sendLastSector(init.initSector(sector)); ins.close(); isEnd=true; break; //} // nBytes=-1; } //k = init.initSector(sector); sendDataToSerialPort(init.initSector(sector)); while(!isAck() && errorcunter <TransferSpecification.MAXERRORS){ //sendDataToSerialPort(init.initSector(sector)); if(!isAck()) ++errorcunter; else break; } for(int z= 0; z< sector.length ;z++){ sector[z]=0; } if(errorcunter == TransferSpecification.MAXERRORS){ System.out.println("Max error"); break; } init.setPacknumbet(++blocknumber); System.out.println(blocknumber); nBytes = ins.read(sector); }/* do { if(k==packet){ b = ins.read(c); sendDataToSerialPort(init.initLastSector(c, positon)); break; } else{ b = ins.read(c); if (b != -1) { init.setPacknumbet(k); k++; sendDataToSerialPort(init.initSectorsmall(c)); } } } while (b != -1 && isAck()); * */ }catch(IOException ex){} } private void sendLastSector(byte[] data){ byte[] k = new byte[133]; sendDataToSerialPort(data); sendDataToSerialPort(new byte[]{TransferSpecification.EOT}); k= init.initLastSector(); sendDataToSerialPort(init.initLastSector()); END=true; restartDMX(); //schliesseSerialPort(); } private void SendFirstsector(){ sendDataToSerialPort(init.initFirstSector(file)); if(in!=TransferSpecification.ACK && counter <TransferSpecification.MAXERRORS){ SendFirstsector(); counter++; } else if(counter == TransferSpecification.MAXERRORS) YModemGUIJAVAView.jTextArea1.setText("Time out to send"); else if(in!=TransferSpecification.ACK) YModemGUIJAVAView.jTextArea1.setText("Not ACK"); else{ counter = 0; isFirstSector=false; } } class PortEvetntListener implements purejavacomm.SerialPortEventListener{ public void serialEvent(SerialPortEvent event) { System.out.println("serialPortEventlistener"); switch (event.getEventType()) { case SerialPortEvent.DATA_AVAILABLE: serialPortDatenVerfuegbar(); break; case SerialPortEvent.BI: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.FE: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: case SerialPortEvent.PE: case SerialPortEvent.RI: default: } } } }